#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>

#define RTMP_URL "rtmp://push.douyin.com/live/your_stream_key"

int main() {
    av_register_all();
    avformat_network_init();

    AVFormatContext *pFormatCtx = NULL;
    AVStream *video_st = NULL;
    AVCodecContext *pCodecCtx = NULL;
    AVCodec *pCodec = NULL;

    // 创建输出上下文
    if (avformat_alloc_output_context2(&pFormatCtx, NULL, "flv", RTMP_URL) < 0) {
        fprintf(stderr, "Could not create output context\n");
        return -1;
    }

    // 查找视频编码器
    pCodec = avcodec_find_encoder(AV_CODEC_ID_H264);
    if (!pCodec) {
        fprintf(stderr, "Codec not found\n");
        return -1;
    }

    // 创建视频流
    video_st = avformat_new_stream(pFormatCtx, pCodec);
    if (!video_st) {
        fprintf(stderr, "Failed to allocate stream\n");
        return -1;
    }

    // 设置编码器参数
    pCodecCtx = avcodec_alloc_context3(pCodec);
    pCodecCtx->bit_rate = 400000;
    pCodecCtx->width = 640;
    pCodecCtx->height = 480;
    pCodecCtx->time_base = (AVRational){1, 25};
    pCodecCtx->framerate = (AVRational){25, 1};
    pCodecCtx->gop_size = 10;
    pCodecCtx->max_b_frames = 1;
    pCodecCtx->pix_fmt = AV_PIX_FMT_YUV420P;

    // 连接编码器和流
    if (avcodec_parameters_from_context(video_st->codecpar, pCodecCtx) < 0) {
        fprintf(stderr, "Failed to copy codec parameters to stream\n");
        return -1;
    }

    // 打开编码器
    if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) {
        fprintf(stderr, "Could not open codec\n");
        return -1;
    }

    // 打开输出流
    if (!(pFormatCtx->oformat->flags & AVFMT_NOFILE)) {
        if (avio_open(&pFormatCtx->pb, RTMP_URL, AVIO_FLAG_WRITE) < 0) {
            fprintf(stderr, "Could not open output URL '%s'\n", RTMP_URL);
            return -1;
        }
    }

    // 写文件头
    if (avformat_write_header(pFormatCtx, NULL) < 0) {
        fprintf(stderr, "Error occurred when opening output URL\n");
        return -1;
    }

    // 这里可以添加视频帧的生成和推送代码
    // 例如，使用av_interleaved_write_frame()推送编码后的帧

    // 写文件尾
    av_write_trailer(pFormatCtx);

    // 清理
    avcodec_free_context(&pCodecCtx);
    avformat_free_context(pFormatCtx);
    avformat_network_deinit();

    return 0;
} 